#include "widget.h"
#include "ui_widget.h"

void Widget::new_client()
{
    while (tcpServer.hasPendingConnections()) {
        // 获取新的连接
        QTcpSocket* socket = tcpServer.nextPendingConnection();
        // 连接readyRead信号到read_data()函数
        connect(socket, &QTcpSocket::readyRead, this, &Widget::read_data);
        // 你可以在这里添加更多的信号和槽连接，例如连接disconnected信号
        connect(socket, &QTcpSocket::disconnected, socket, &QTcpSocket::deleteLater);
    }
}

void Widget::read_data()
{
    // 获取信号发送者
    QTcpSocket *cSocket = qobject_cast<QTcpSocket*>(sender());
    if (cSocket) {
        // 获取客户端IP地址
        QString ip = cSocket->peerAddress().toString();
        // 读取客户端数据
        QString msg = cSocket->readAll();
        // 处理数据...
        qDebug()<<msg;
        //解析json
       // updateParkingStatus(no,license_plate_number,last_entry_time, time,expense);
    }
}

void Widget::setupConnections() {
    // 初始化网络功能
    if (!tcpServer.listen(QHostAddress::Any, 10000)) {
        qDebug() << "Unable to start the server" << tcpServer.errorString();
        return;
    }

    // 连接新连接的信号到处理函数
    connect(&tcpServer, &QTcpServer::newConnection, this, &Widget::new_client);

    // 检测端口是否成功绑定
    if (!testPortBinding()) {
        qDebug() << "The specified port is already in use.";
        return;
    }
}

bool Widget::testPortBinding() {
    // 创建一个临时的套接字
    QTcpSocket socket;
    QHostAddress ipAddress("192.168.1.111"); // 使用字符串构造QHostAddress
    quint16 port(10000); // 将整数端口号转换为quint16类型

    socket.bind(ipAddress, port);

    // 检查是否有错误发生
    if (socket.state() == QAbstractSocket::BoundState)
    {
        // 端口绑定成功
        return true;
    }
    else
    {
        // 绑定失败，可能是因为端口已被占用
        qDebug() << "Failed to bind to the port." << socket.errorString();
        return false;
    }
}


